/**
 * A pálya egyetlen mezőjét reprezentáló objektum. Bármilyen, az Entity
 * absztrakt osztályból származó pályaelemet tartalmazhat. Négy irányba
 * (fel, le, jobbra, balra) levő szomszédaira mutató referenciákat ismeri.
 */
public class Field
{
  /**
   * A mező szomszédait négy irányban tárolja.
   * (Indexek: 0-> fel, 1-> jobb, 2->le, 3->bal)
   */
  private Field _neighbours[] = new Field[4];

  /**
   * A Field példányt létrehozó Game osztály példány referenciája.
   */
  private Game _game;

  /**
   * A mező által tartalmazott Entity referenciája.
   */
  private Entity _entity = null;

  /**
   * Nem része a játéknak, csak a sok példányos objektumok logban való könnyebb
   * azonosítására szolgál.
   */
  private int ID = SkeletonHelper.GetObjectID();
  
  /**
   * A konstruktorban megkapja az őt létrehozó Game osztály példány 
   * referenciáját, hogy később tudjon rá hivatkozni.
   * @param game A Game osztály referenciája.
   */
  public Field(Game game)
  {
    SkeletonHelper.FunctionBegin(ID,"Field", "Konstruktor");

    _game = game;
    for(int i = 0;i<4;i++)
    {
      _neighbours[i] = null;
    }

    SkeletonHelper.FunctionEnd(ID,"Field", "Konstruktor");
  }

  /**
   * A mező ürességének ellenőrzése.
   * @return Ha a mező üres true, ha nem akkor false
   */
  public boolean isEmpty()
  {
    SkeletonHelper.FunctionBegin(ID,"Field", "isEmpty");

    String s = SkeletonHelper.Ask("Üres a mező?", "(i) igen, (n) nem");

    SkeletonHelper.FunctionEnd(ID,"Field", "isEmpty");

    return s.equals("i");
  }

  /**
   * A Field tartalmát jelképező Entity referenciát null-ra állítja.
   */
  public void delete()
  {
    SkeletonHelper.FunctionBegin(ID,"Field", "delete");

    _entity = null;

    SkeletonHelper.FunctionEnd(ID,"Field", "delete");
  }

  /**
   * A megadott Entityt elhelyezi a mezőben.
   * @param param A Fieldbe helyezendő Entity referenciája.
   */
  public void add(Entity param)
  {
    SkeletonHelper.FunctionBegin(ID,"Field", "add");

    _entity = param;
    param.setField(this);

    SkeletonHelper.FunctionEnd(ID,"Field", "add");
  }

  /**
   * Visszaadja a mező egy adott irányban található szomszédját.
   * @param direction Az irány, hogy melyik szomszédot várjuk.
   * @return Az adott irányban található szomszéd referenciája.
   */
  public Field getNeighbour(int direction)
  {
    SkeletonHelper.FunctionBegin(ID,"Field", "getNeighbour");

    SkeletonHelper.FunctionEnd(ID,"Field", "getNeighbour", "[" + _neighbours[direction].ID + "]");
    return _neighbours[direction];
  }

  /**
   * Beállítja a mező egy szomszédját egy adott irányba.
   * @param direction A beállítandó szomszéd relatív helyzete (0 -> fel,
   * 1-> jobb, 2-> le, 3-> bal)
   * @param neighbour A beállytandó szomszéd referenciája.
   */
  public void setNeighbour(int direction, Field neighbour)
  {
    SkeletonHelper.FunctionBegin(ID,"Field", "setNeighbour");
    _neighbours[direction] = neighbour;

    SkeletonHelper.FunctionEnd(ID,"Field", "setNeighbour");
  }

  /**
   * Visszaadja a game osztály példányát.
   * @return
   */
  public Game getGame()
  {
    return _game;
  }

  /**
   * Visszaadja azon Entity referenciáját, amit a mező tartalmaz.
   * @return A tartalamzott Entity referenciája.
   */
  public Entity getEntity()
  {
    SkeletonHelper.FunctionBegin(ID,"Field", "getEntity");

    SkeletonHelper.FunctionEnd(ID,"Field", "getEnity", "[" + _entity.ID + "]");
    return _entity;
  }
}